#ifndef MQSIMPLECONSUMER_H
#define MQSIMPLECONSUMER_H

#include <QObject>
#include <QTimer>
#include <QThread>
#include <QMutex>
#include <QElapsedTimer>
#include <memory>
#include "mqclient.h"
#include "mqmessagehandler.h"

/**
 * @brief 简化的消息统计结构
 */
struct SimpleStats {
    int totalMessages = 0;      ///< 总消息数
    int successCount = 0;       ///< 成功处理数
    int errorCount = 0;         ///< 错误处理数
    qint64 lastProcessTime = 0; ///< 最后处理时间(ms)
    
    /**
     * @brief 获取成功率
     * @return 成功率百分比
     */
    double getSuccessRate() const {
        return totalMessages > 0 ? (double)successCount / totalMessages * 100.0 : 0.0;
    }
};

/**
 * @brief 简化的MQ消息消费者
 * 
 * 专为低频消息场景设计的轻量级消费者
 * 特点：
 * - 直接在轮询中同步处理消息
 * - 移除复杂的任务队列机制
 * - 合并连接状态管理到轮询逻辑
 * - 在独立线程中运行，避免阻塞UI
 */
class MQSimpleConsumer : public QObject
{
    Q_OBJECT
    
public:
    /**
     * @brief 构造函数
     * @param client MQ客户端实例
     * @param parent 父对象
     */
    explicit MQSimpleConsumer(std::shared_ptr<MQClient> client, QObject* parent = nullptr);
    
    /**
     * @brief 析构函数
     */
    ~MQSimpleConsumer() override;
    
    /**
     * @brief 启动消费（在独立线程中）
     * @param queueName 队列名称
     * @param handler 消息处理器
     * @param pollInterval 轮询间隔（毫秒），默认1000ms
     * @return 启动是否成功
     */
    bool startConsuming(const QString& queueName, 
                       std::shared_ptr<MQMessageHandler> handler,
                       int pollInterval = 1000);
    
    /**
     * @brief 停止消费
     * @param waitForFinished 是否等待当前处理完成
     */
    void stopConsuming(bool waitForFinished = true);
    
    /**
     * @brief 获取统计信息
     * @return 统计信息结构
     */
    SimpleStats getStats() const;
    
    /**
     * @brief 获取消费状态
     * @return true表示正在消费
     */
    bool isConsuming() const;
    
    /**
     * @brief 设置轮询间隔
     * @param interval 轮询间隔（毫秒）
     */
    void setPollInterval(int interval);
    
signals:
    /**
     * @brief 消息处理完成信号
     * @param success 是否成功
     */
    void messageProcessed(bool success);
    
    /**
     * @brief 连接状态变化信号
     * @param connected 是否连接
     */
    void connectionStatusChanged(bool connected);
    
    /**
     * @brief 错误信号
     * @param error 错误信息
     */
    void errorOccurred(const QString& error);
    
    /**
     * @brief 消息接收信号
     * @param queueName 队列名称
     * @param message 消息内容
     */
    void messageReceived(const QString& queueName, const QByteArray& message);
    
private slots:
    /**
     * @brief 轮询并处理消息
     */
    void pollAndProcess();
    
private:
    std::shared_ptr<MQClient> m_client;                    ///< MQ客户端
    std::shared_ptr<MQMessageHandler> m_handler;           ///< 消息处理器
    QThread* m_workerThread;                               ///< 工作线程
    QTimer* m_pollTimer;                                   ///< 轮询定时器
    QString m_queueName;                                   ///< 队列名称
    mutable QMutex m_statsMutex;                           ///< 统计信息互斥锁
    SimpleStats m_stats;                                   ///< 统计信息
    bool m_consuming;                                      ///< 消费状态
    bool m_lastConnectionStatus;                           ///< 上次连接状态
    
    /**
     * @brief 处理连接丢失
     */
    void handleConnectionLost();
    
    /**
     * @brief 更新统计信息
     * @param success 处理是否成功
     */
    void updateStats(bool success);
    
    /**
     * @brief 带超时的消息处理
     * @param message 消息内容
     * @param timeoutMs 超时时间（毫秒）
     * @return 处理是否成功
     */
    bool processWithTimeout(const QByteArray& message, int timeoutMs = 5000);
    
    /**
     * @brief 处理错误
     * @param error 错误信息
     */
    void handleError(const QString& error);
};

#endif // MQSIMPLECONSUMER_H